﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CompareTools.Tools
{
    public static class ToolsBase
    {
        /// <summary>
        /// 获取所有重复项的信息，包括出现次数、重复次数、总重复数量、以及每个重复项在原始数据中的索引。
        /// </summary>
        /// <param name="data">要分析的字符串集合</param>
        /// <param name="duplicateItems">输出：重复项及其总出现次数</param>
        /// <param name="duplicateCounts">输出：重复项及其重复的次数（出现次数 - 1）</param>
        /// <param name="duplicateIndices">输出：重复项在原始集合中的所有索引位置</param>
        /// <returns>总重复数量（所有重复项的重复次数之和）</returns>
        public static int GetDuplicatesFullInfo(
            IList<string> data,
            out Dictionary<string, int> duplicateItems,
            out Dictionary<string, int> duplicateCounts,
            out Dictionary<string, List<int>> duplicateIndices)
        {
            // 临时字典，用于统计每个项的出现次数
            var countDict = new Dictionary<string, int>();

            // 初始化输出参数
            duplicateItems = new Dictionary<string, int>();        // 重复项及其出现总次数
            duplicateCounts = new Dictionary<string, int>();       // 重复项的重复次数（出现次数 - 1）
            duplicateIndices = new Dictionary<string, List<int>>(); // 重复项在集合中的所有索引
            int totalDuplicates = 0; // 所有重复项的重复次数之和

            // 遍历所有数据
            for (int i = 0; i < data.Count; i++)
            {
                var item = data[i];

                // 记录索引
                if (!duplicateIndices.ContainsKey(item))
                    duplicateIndices[item] = new List<int>();
                duplicateIndices[item].Add(i);

                // 统计出现次数
                if (!countDict.ContainsKey(item))
                    countDict[item] = 0;
                countDict[item]++;
            }

            // 分析重复项
            foreach (var kv in countDict)
            {
                if (kv.Value > 1)
                {
                    // 是重复项：记录总次数和重复次数
                    duplicateItems[kv.Key] = kv.Value;
                    duplicateCounts[kv.Key] = kv.Value ;
                    totalDuplicates += kv.Value ;
                }
                else
                {
                    // 非重复项：移除对应的索引记录
                    duplicateIndices.Remove(kv.Key);
                }
            }

            return totalDuplicates;
        }


    }
}
